/* 以异步 I/O 方式读取鼠标数据 */
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <signal.h>

#define MOUSE "/dev/input/mouse0"

static int fd;

static void sigio_handler(int sig)
{
    static int loops = 5;
    char buf[100] = { 0 };
    int ret;

    if (SIGIO != sig) {
        return;
    }

    ret = read(fd, buf, sizeof(buf));
    if (0 < ret) {
        printf("鼠标：成功读取<%d>\n个字节数据", ret);
    }

    loops--;
    if (0 >= loops) {
        close(fd);
        exit(0);
    }
}

int main(int argc, char *argv[])
{
    int flag;

    /* 打开鼠标设备文件（使能非阻塞I/O) */
    fd = open(MOUSE, O_RDONLY | O_NONBLOCK);
    if (-1 == fd) {
        perror("打开鼠标设备文件失败");
        exit(-1);
    }

    /* 只能异步 I/O */
    flag = fcntl(fd, F_GETFL);
    flag |= O_ASYNC;
    fcntl(fd, F_SETFL, flag);

    /* 设置异步 I/O 的所有者 */
    fcntl(fd, F_SETOWN, getpid());

    /* 设置异步 I/O 的信号处理函数 */
    signal(SIGIO, sigio_handler);

    for (;;) {
        sleep(1);
    }

    exit(0);
}